// in keyof 扁平化属性名
type Modules = {
  menu: {
    setActiveIndex: (index: string) => string
    setCollapse: (index: string) => string
  }
  tabs: {
    seteditableTabsValue: (editValue: string) => void
    setTabs: (index: string) => void
    setTabsList: (index: string) => void
  }
}

// 1、模板字符串
type MB<T, K> = `${T & string}/${K & string}`

// 2、拿到模块的属性名
type ModulesKeys<T> = {
  [K in keyof T]: T[K]
}

// 3、父、子模块联合起来
type ModulesSpliceKeyOfProp<T> = {
  [K in keyof T]: MB<K, keyof T[K]>
}

// 4、取出新类型里的所有属性值的类型，所组成的联合类型。
type ModulesSpliceKey<T> = {
  [K in keyof T]: MB<K, keyof T[K]>
}[keyof T]
// 后面可以加[keyof T]的解释：keyof T是取出对象所有中的属性
// 前面看成一个obj，就是obj[key1] | obj[key2] | ... 的这种写法
// 所以{[K in keyof T]: T[K]}[keyof T]，就是由该对象所有属性值类型组成的联合类型

type ModulesMenu = ModulesSpliceKey<Modules>

export {}